home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PluginSRC_EvenMore / converthtml.e < prev    next >
Text File  |  2002-03-12  |  18KB  |  670 lines

  1. /*
  2.    HTML to text converter
  3.    EvenMore FileIO plugin
  4.    Author: Chris Perver
  5.    Copyright (c) 2001
  6. */
  7.  
  8.  
  9. OPT MODULE, REG=5
  10.  
  11.  
  12. MODULE 'tools/ctype'
  13.  
  14.  
  15. EXPORT PROC convhtml(memadr:PTR TO CHAR, begin, lenadr, mem2 = NIL:PTR TO CHAR, lenadr2 = NIL)
  16.   DEF count = 0, count2 = 0
  17.   DEF notdone = TRUE
  18.   -> Allocate memory for file
  19. ->  IF (mem2 := New(lenadr1)) = NIL THEN RETURN -1
  20. ->  mem2[lenadr + 1] := "\n"                                                      -> Put safety LF at the end of mem
  21.  
  22.   DEF html[256]:STRING, wordwrap = 80, cchar = 0, ww = TRUE, oldpos = 0, oldcc = 0, i, j
  23.   DEF pre = FALSE, iscomm = FALSE
  24.   DEF isnotend = TRUE
  25.  
  26.   IF mem2 = NIL
  27.     mem2    := memadr
  28.     lenadr2 := lenadr
  29.   ENDIF
  30.   count  := begin
  31.   count2 := begin
  32.  
  33.   WHILE notdone AND (count < lenadr) AND (count2 < lenadr2)
  34.  
  35.  
  36.     SELECT 256 OF memadr[count]
  37.       -> SPECIAL
  38.       CASE "&"
  39.         UpperStr(StrCopy(html, memadr + count + 1,10))
  40.         IF InStr(html, 'NBSP') = 0
  41.           mem2[count2++] := " "
  42.           INC cchar
  43.         ELSEIF InStr(html, 'AMP') = 0
  44.           mem2[count2++] := "&"
  45.           INC cchar
  46.         ELSEIF InStr(html, 'QUOT') = 0
  47.           mem2[count2++] := $22
  48.           INC cchar
  49.         ELSEIF InStr(html, 'LT') = 0
  50.           mem2[count2++] := "<"
  51.           INC cchar
  52.         ELSEIF InStr(html, 'GT') = 0
  53.           mem2[count2++] := ">"
  54.           INC cchar
  55.         ENDIF
  56.         WHILE memadr[count] <> ";" DO INC count
  57.         INC count
  58.  
  59.       -> Ignore LF, CR
  60.       CASE "\n", "\b"
  61.         IF pre = FALSE
  62.  
  63.           IF mem2[count2 - 1] <> " "
  64.             IF iscomm = FALSE
  65.               mem2[count2++] := " "
  66.             ENDIF
  67.           ENDIF
  68.  
  69.  
  70.         ELSE
  71.           mem2[count2++] := memadr[count]
  72.           cchar := 0
  73.         ENDIF
  74.         INC count
  75.  
  76.         -> Skip prespaces
  77.         WHILE memadr[count] = " " DO INC count
  78.  
  79.       -> Cut out extra spaces
  80.       CASE " "
  81.         IF pre = FALSE
  82.           IF mem2[count2-1] <> " "
  83.             mem2[count2++] := memadr[count++]
  84.             INC cchar
  85.           ENDIF
  86.           WHILE memadr[count] = " " DO INC count
  87.         ELSE
  88.           mem2[count2++] := memadr[count++]
  89.           INC cchar
  90.         ENDIF
  91.  
  92.       -> Commands
  93.       CASE "<"
  94.         iscomm := TRUE
  95.  
  96.         INC count
  97.  
  98.         -> Get len
  99.         i := count
  100.         WHILE memadr[i] <> ">" DO INC i
  101.         INC i
  102.         UpperStr(StrCopy(html, memadr + count, i - count))
  103.  
  104.  
  105.         SELECT 256 OF memadr[count]
  106.  
  107.           -> END OF COMMAND
  108.           CASE "/"
  109.             iscomm := FALSE
  110.  
  111.             -> UNDO BOLD
  112.             IF memadr[count + 2] = ">"
  113.               SELECT 256 OF memadr[count + 1]
  114.                 CASE "a", "A"
  115.                   mem2[count2++] := "\e"
  116.                   mem2[count2++] := "["
  117.                   mem2[count2++] := "2"
  118.                   mem2[count2++] := "4"
  119.                   mem2[count2++] := ";"
  120.                   mem2[count2++] := "3"
  121.                   mem2[count2++] := "1"
  122.                   mem2[count2++] := "m"
  123.                 CASE "b", "B"
  124.                   mem2[count2++] := "\e"
  125.                   mem2[count2++] := "["
  126.                   mem2[count2++] := "2"
  127.                   mem2[count2++] := "1"
  128.                   mem2[count2++] := "m"
  129.                 CASE "i", "I"
  130.                   mem2[count2++] := "\e"
  131.                   mem2[count2++] := "["
  132.                   mem2[count2++] := "2"
  133.                   mem2[count2++] := "3"
  134.                   mem2[count2++] := "m"
  135.                 CASE "u", "U"
  136.                   mem2[count2++] := "\e"
  137.                   mem2[count2++] := "["
  138.                   mem2[count2++] := "2"
  139.                   mem2[count2++] := "4"
  140.                   mem2[count2++] := "m"
  141.                 CASE "p", "P"
  142.                   mem2[count2++] := "\n"
  143.                   cchar := 0
  144.  
  145.               ENDSELECT
  146.               count := i
  147.  
  148.             -> IGNORE
  149.             ELSE
  150.  
  151.  
  152.               SELECT 256 OF memadr[count + 1]
  153.                 -> ADDRESS
  154.                 CASE "a", "A"
  155.                   IF InStr(html, '/ADDRESS') = 0
  156.                     mem2[count2++] := "\e"
  157.                     mem2[count2++] := "["
  158.                     mem2[count2++] := "2"
  159.                     mem2[count2++] := "1"
  160.                     mem2[count2++] := ";"
  161.                     mem2[count2++] := "2"
  162.                     mem2[count2++] := "3"
  163.                     mem2[count2++] := "m"
  164.                   ENDIF
  165.                 -> CENTER, CITE
  166.                 CASE "c", "C"
  167.                   IF InStr(html, '/CITE') = 0
  168.                     mem2[count2++] := "\e"
  169.                     mem2[count2++] := "["
  170.                     mem2[count2++] := "2"
  171.                     mem2[count2++] := "3"
  172.                     mem2[count2++] := "m"
  173.                   ELSEIF InStr(html, '/CENTER') = 0
  174.                     mem2[count2++] := "\n"
  175.                     cchar := 0
  176.                   ENDIF
  177.  
  178.                 -> END DD
  179.                 CASE "d", "D"
  180.                   IF InStr(html, '/DD') = 0
  181.                     cchar := 0
  182.                   ENDIF
  183.  
  184.                 -> END OF HEADER
  185.                 CASE "h", "H"
  186.                   IF InStr(html, '/H') = 0
  187.                     IF (memadr[count+2] >= "1" AND memadr[count+2] <= "6")
  188.                         mem2[count2++] := "\n"
  189.                         mem2[count2++] := "\n"
  190.                         cchar := 0
  191.                     ENDIF
  192.                   ENDIF
  193.  
  194.                 -> END OF PRE
  195.                 CASE "p", "P"
  196.                   IF InStr(html, '/PRE') = 0
  197.                     mem2[count2++] := "\n"
  198.                     cchar := 0
  199.                     pre := FALSE
  200.                   -> END OF PARA
  201.                   ELSEIF InStr(html, '/P') = 0 ->memadr[count+2] = ">"
  202.                     mem2[count2++] := "\n"
  203.                     cchar := 0
  204.                   ENDIF
  205.  
  206.                 -> END OF BULLET
  207.                 CASE "t", "T"
  208.                   IF InStr(html, '/TD') = 0
  209.                     mem2[count2++] := "\n"
  210.                     cchar := 0
  211.                   ENDIF
  212.  
  213.                 -> /STRONG
  214.                 CASE "s", "S"
  215.                   IF InStr(html, '/STRONG') = 0
  216.                     mem2[count2++] := "\e"
  217.                     mem2[count2++] := "["
  218.                     mem2[count2++] := "2"
  219.                     mem2[count2++] := "1"
  220.                     mem2[count2++] := "m"
  221.                   ENDIF
  222.  
  223.                 -> /VAR
  224.                 CASE "v", "V"
  225.                   IF InStr(html, '/VAR') = 0
  226.                     mem2[count2++] := "\e"
  227.                     mem2[count2++] := "["
  228.                     mem2[count2++] := "2"
  229.                     mem2[count2++] := "3"
  230.                     mem2[count2++] := "m"
  231.                   ENDIF
  232.  
  233.               ENDSELECT
  234.  
  235.               count := i
  236.              ENDIF
  237.  
  238.  
  239.  
  240.           -> COMMENT
  241.           CASE "!"
  242.             count := i
  243.  
  244.           -> URL
  245.           CASE "a", "A"
  246.             IF InStr(html, 'HREF') > 0
  247.               count := i
  248.  
  249.               mem2[count2++] := "\e"
  250.               mem2[count2++] := "["
  251.               mem2[count2++] := "4"
  252.               mem2[count2++] := ";"
  253.               mem2[count2++] := "3"
  254.               mem2[count2++] := "3"
  255.               mem2[count2++] := "m"
  256.             ELSEIF InStr(html, 'NAME') > 0
  257.               count := i
  258.             ELSEIF InStr(html, 'AREA') = 0
  259.               count := i
  260.             ELSEIF InStr(html, 'ADDRESS') = 0
  261.               mem2[count2++] := "\e"
  262.               mem2[count2++] := "["
  263.               mem2[count2++] := "1"
  264.               mem2[count2++] := ";"
  265.               mem2[count2++] := "3"
  266.               mem2[count2++] := "m"
  267.               count := i
  268.             ENDIF
  269.  
  270.           -> BODY, BASE, BREAK
  271.           CASE "b", "B"
  272.             -> BOLD
  273.             IF InStr(html, 'BODY') = 0
  274.               count := i
  275.             ELSEIF InStr(html, 'BASE') = 0
  276.               count := i
  277.             ELSEIF InStr(html, 'BR') = 0
  278.               mem2[count2++] := "\n"
  279.               cchar := 0
  280.               count := i
  281.  
  282.             -> Take it as BOLD
  283.             ELSE
  284.  
  285.               mem2[count2++] := "\e"
  286.               mem2[count2++] := "["
  287.               mem2[count2++] := "1"
  288.               mem2[count2++] := "m"
  289.  
  290.               count := i
  291.             ENDIF
  292.  
  293.           -> CENTER, CITE, CODE
  294.           CASE "c", "C"
  295.             IF InStr(html, 'CENTER') = 0
  296.               count := i
  297.             ELSEIF InStr(html, 'CODE') = 0
  298.               count := i
  299.             ELSEIF InStr(html, 'CITE') = 0
  300.               count := i
  301.  
  302.               mem2[count2++] := "\e"
  303.               mem2[count2++] := "["
  304.               mem2[count2++] := "3"
  305.               mem2[count2++] := "m"
  306.             ENDIF
  307.  
  308.           -> LISTS
  309.           CASE "d", "D"
  310.             IF InStr(html, 'DD') = 0
  311.               mem2[count2++] := "\n"
  312.               cchar := 0
  313.               count := i
  314.             ELSEIF InStr(html, 'DL') = 0
  315.               mem2[count2++] := "\n"
  316.               cchar := 0
  317.               count := i
  318.             ELSEIF InStr(html, 'DT') = 0
  319.               count := i
  320.             ELSEIF InStr(html, 'DIV') = 0
  321.               mem2[count2++] := "\n"
  322.               count := i
  323.  
  324.             ENDIF
  325.  
  326.           -> EMPHASIZE
  327.           CASE "e", "E"
  328.             IF InStr(html, 'EM') = 0
  329.               count := i
  330.             ENDIF
  331.  
  332.           -> FONT
  333.           CASE "f", "F"
  334.             IF InStr(html, 'FONT') = 0
  335.               count := i
  336.             ELSEIF InStr(html, 'FRAME') = 0
  337.               count := i
  338.             ELSEIF InStr(html, 'FORM') = 0
  339.               count := i
  340.             ENDIF
  341.  
  342.           -> HTML, HEAD, HEADINGS, HORIZ RULE
  343.           CASE "h", "H"
  344.             IF (memadr[count+1] >= "1" AND memadr[count+1] <= "6")
  345.               mem2[count2++] := "\n"
  346.  
  347.               mem2[count2++] := "\e"
  348.               mem2[count2++] := "["
  349.               mem2[count2++] := "1"
  350.               mem2[count2++] := "m"
  351.  
  352.               cchar := 0
  353.               count := i
  354.             ELSEIF InStr(html, 'HTML') = 0
  355.               count := i
  356.             ELSEIF InStr(html, 'HEAD') = 0
  357.               count := i
  358.             ELSEIF InStr(html, 'HR') = 0
  359.               mem2[count2++] := "\n"
  360.               mem2[count2++] := "\n"
  361.               FOR j := 0 TO 79
  362.                 mem2[count2++] := "-"
  363.               ENDFOR
  364.               mem2[count2++] := "\n"
  365.               mem2[count2++] := "\n"
  366.               cchar := 0
  367.  
  368.               count := i
  369.             ENDIF
  370.  
  371.           -> STYLES
  372.           CASE "i", "I"
  373.              -> ITALIC
  374.             IF memadr[count+1] = ">"
  375.  
  376.               mem2[count2++] := "\e"
  377.               mem2[count2++] := "["
  378.               mem2[count2++] := "3"
  379.               mem2[count2++] := "m"
  380.  
  381.               count := count + 2
  382.             ELSE
  383.               IF InStr(html, 'IMG') = 0
  384.                 mem2[count2++] := "["
  385.                 INC cchar
  386.  
  387.                 j := InStr(html, 'ALT')
  388.                 IF j >= 0
  389.                   count := count + j + 1
  390.  
  391.                   WHILE memadr[count] <> $22 DO INC count
  392.                   INC count
  393.  
  394.                   WHILE memadr[count] <> $22
  395.                     mem2[count2++] := memadr[count++]
  396.                     INC cchar
  397.                   ENDWHILE
  398.                 ENDIF
  399.  
  400.                 count := i
  401.  
  402.  
  403.                 mem2[count2++] := "]"
  404.                 INC cchar
  405.  
  406.               ELSEIF InStr(html, 'INPUT') = 0
  407.                 mem2[count2++] := "\e"
  408.                 mem2[count2++] := "["
  409.                 mem2[count2++] := "4"
  410.                 mem2[count2++] := ";"
  411.                 mem2[count2++] := "3"
  412.                 mem2[count2++] := "3"
  413.                 mem2[count2++] := "m"
  414.  
  415.                 IF (InStr(html, 'HIDDEN')) = FALSE
  416.  
  417.                   j := InStr(html, 'VALUE')
  418.                   IF j >= 0
  419.                     count := count + j + 1
  420.  
  421.                     WHILE memadr[count] <> $22 DO INC count
  422.                     INC count
  423.  
  424.                     WHILE memadr[count] <> $22
  425.                       mem2[count2++] := memadr[count++]
  426.                       INC cchar
  427.                     ENDWHILE
  428.                   ENDIF
  429.                 ENDIF
  430.  
  431.                 count := i
  432.  
  433.                 mem2[count2++] := "\e"
  434.                 mem2[count2++] := "["
  435.                 mem2[count2++] := "2"
  436.                 mem2[count2++] := "4"
  437.                 mem2[count2++] := ";"
  438.                 mem2[count2++] := "3"
  439.                 mem2[count2++] := "1"
  440.                 mem2[count2++] := "m"
  441.               ELSEIF InStr(html, 'IFRAME') = 0
  442.                 count := i
  443.               ELSEIF InStr(html, 'ISINDEX') = 0
  444.                 count := i
  445.               ELSEIF InStr(html, 'ILAYER') = 0
  446.                 count := i
  447.               ENDIF
  448.             ENDIF
  449.  
  450.           -> LIST
  451.           CASE "l", "L"
  452.             IF InStr(html, 'LI') = 0
  453.               count := i
  454.               mem2[count2++] := "\n"
  455.               mem2[count2++] := "o"
  456.               mem2[count2++] := " "
  457.               cchar := 2
  458.             ENDIF
  459.  
  460.           -> META TAG, MAP
  461.           CASE "m", "M"
  462.             IF InStr(html, 'META') = 0
  463.               count := i
  464.             ELSEIF InStr(html, 'MAP') = 0
  465.               count := i
  466.             ENDIF
  467.  
  468.           -> NO FRAMES
  469.           CASE "n", "N"
  470.             IF InStr(html, 'NOFRAMES') = 0
  471.               count := i
  472.             ELSEIF InStr(html, 'NOBR') = 0
  473.               count := i
  474.             ELSEIF InStr(html, 'NOLAYER') = 0
  475.               count := i
  476.             ENDIF
  477.  
  478.           -> ?
  479.           CASE "o", "O"
  480.             IF InStr(html, 'O:') = 0
  481.               count := i
  482.             ELSEIF InStr(html, 'OL') = 0
  483.               count := i
  484.             ELSEIF InStr(html, 'OPTION') = 0
  485.               mem2[count2++] := "\n"
  486.               mem2[count2++] := "o"
  487.               mem2[count2++] := " "
  488.               cchar := 2
  489.               count := i
  490.             ENDIF
  491.  
  492.           -> PARAGRAPH, PRE!?
  493.           CASE "p", "P"
  494.             IF InStr(html, 'PRE') = 0
  495.               mem2[count2++] := "\n"
  496.               cchar := 0
  497.               pre := TRUE
  498.               count := i
  499.             -> PARA
  500.             ELSE
  501.            ->   para := TRUE
  502.               mem2[count2++] := "\n"
  503.               mem2[count2++] := "\n"
  504.               cchar := 0
  505.               count := i
  506.             ENDIF
  507.  
  508.           -> STRONG, SMALL, SAMP
  509.           CASE "s", "S"
  510.             IF InStr(html, 'STRONG') = 0
  511.               mem2[count2++] := "\e"
  512.               mem2[count2++] := "["
  513.               mem2[count2++] := "1"
  514.               mem2[count2++] := "m"
  515.  
  516.               count := i
  517.             ELSEIF InStr(html, 'SMALL') = 0
  518.               count := i
  519.             ELSEIF InStr(html, 'SAMP') = 0
  520.               count := i
  521.             ELSEIF InStr(html, 'STYLE') = 0
  522.               count := i
  523.  
  524.               isnotend := TRUE
  525.               WHILE isnotend
  526.                 WHILE memadr[count] <> "<" DO INC count
  527.                 UpperStr(StrCopy(html, memadr+count, 10))
  528.                 IF InStr(html, '</STYLE>') = 0
  529.                   count := count + 8
  530.                   isnotend := FALSE
  531.                 ELSE
  532.                   INC count
  533.                 ENDIF
  534.               ENDWHILE
  535.             ELSEIF InStr(html, 'SCRIPT') = 0
  536.                count := i
  537.  
  538.                isnotend := TRUE
  539.                WHILE isnotend
  540.                  WHILE memadr[count] <> "<" DO INC count
  541.                  UpperStr(StrCopy(html, memadr+count, 10))
  542.                  IF InStr(html, '</SCRIPT>') = 0
  543.                    count := count + 9
  544.                    isnotend := FALSE
  545.                  ELSE
  546.                    INC count
  547.                  ENDIF
  548.                ENDWHILE
  549.  
  550.             ELSEIF InStr(html, 'SPAN') = 0
  551.               count := i
  552.             ELSEIF InStr(html, 'SELECT') = 0
  553.               count := i
  554.             ENDIF
  555.  
  556.           -> TITLE
  557.           CASE "t", "T"
  558.             IF InStr(html, 'TITLE') = 0
  559.               count := i
  560.  
  561.               WHILE memadr[count] <> "<"
  562.                 INC count
  563.               ENDWHILE
  564.             ELSEIF InStr(html, 'TEXTAREA') = 0
  565.               count := i
  566.             ELSEIF InStr(html, 'TT') = 0
  567.               count := i
  568.             ELSEIF InStr(html, 'TABLE') = 0
  569.               count := i
  570.             ELSEIF InStr(html, 'TR') = 0
  571.               mem2[count2++] := "\n"
  572.               cchar := 0
  573.  
  574.               count := i
  575.             ELSEIF InStr(html, 'TD') = 0
  576.               count := i
  577.               INC cchar
  578.               mem2[count2++] := "\t"
  579.             ELSEIF InStr(html, 'TH') = 0
  580.               mem2[count2++] := "\t"
  581.               INC cchar
  582.  
  583.               count := i
  584.             ELSEIF InStr(html, 'TBODY') = 0
  585.               count := i
  586.             ENDIF
  587.  
  588.           -> UNDERSCORE, LIST
  589.           CASE "u", "U"
  590.             IF memadr[count+1] = ">"
  591.               mem2[count2++] := "\e"
  592.               mem2[count2++] := "["
  593.               mem2[count2++] := "4"
  594.               mem2[count2++] := "m"
  595.               count := count + 2
  596.             ELSEIF InStr(html, 'UL') = 0
  597.               count := i
  598.             ENDIF
  599.  
  600.           -> VAR
  601.           CASE "v", "V"
  602.             IF InStr(html, 'VAR') = 0
  603.               mem2[count2++] := "\e"
  604.               mem2[count2++] := "["
  605.               mem2[count2++] := "3"
  606.               mem2[count2++] := "m"
  607.  
  608.               count := i
  609.             ENDIF
  610.  
  611.         ENDSELECT
  612.  
  613.         -> Skip trailing spaces after <>
  614.    ->     WHILE memadr[count] = " " DO INC count
  615.  
  616.  
  617.       DEFAULT
  618.  
  619.         -> WE ARE ABOUT TO DISPLAY PRINTABLE TEXT
  620.         iscomm := FALSE
  621.  
  622.  
  623.         mem2[count2] := memadr[count++]
  624.         INC cchar
  625.          -> WORDWRAP IF NECESSARY
  626.  
  627.         IF ww = TRUE
  628.           IF cchar >= wordwrap
  629.  
  630.             -> Find last space
  631.  
  632.             IF isspace(mem2[count2]) = TRUE
  633.               mem2[count2++] := "\n"
  634.           ->    INC count2
  635.               cchar := 0
  636.             ELSE
  637.               oldpos := count2
  638.               oldcc  := cchar
  639.               WHILE isspace(mem2[count2]) = FALSE
  640.                 mem2[count2 + 1] := mem2[count2]
  641.                 DEC count2
  642.                 DEC cchar
  643.               ENDWHILE
  644.  
  645.               INC count2
  646.               mem2[count2] := "\n"
  647.               cchar := oldcc - cchar
  648.  
  649.               count2 := oldpos + 1
  650.             ENDIF
  651.           ENDIF
  652.         ENDIF
  653.  
  654.         INC count2
  655.  
  656.       ENDSELECT
  657.  
  658.  
  659.   ENDWHILE
  660.  
  661.  
  662.   mem2[count2] := "\n"
  663.  
  664.  -> IF memadr
  665.  ->   Dispose(memadr); memadr := NIL
  666.  -> ENDIF
  667. ENDPROC mem2, count2
  668. -><
  669.  
  670.